package com.zy.design.pattern.factory;

import com.zy.design.pattern.factory.method.MethodConfigSource;
import com.zy.design.pattern.factory.simple.SimpleConfigSource;
import com.zy.design.pattern.factory.simple.SimpleConfigSourceV2;

/**
 * @author zhaoyi
 * @date 2021/3/29 17:58
 * <p>
 * 创建对象是一个“大工程”的时候，我们一般会选择使用工厂模式，来封装对象复杂的创建过程，将对象的创建和使用分离，让代码更加清晰
 * <p>
 * 用工厂模式的最本质的参考标准
 * <p>
 * 封装变化：
 * 创建逻辑有可能变化，封装成工厂类之后，创建逻辑的变更对调用者透明。
 * <p>
 * 代码复用：
 * 创建代码抽离到独立的工厂类之后可以复用。
 * <p>
 * 隔离复杂性：
 * 封装复杂的创建逻辑，调用者无需了解如何创建对象。
 * <p>
 * 控制复杂度：
 * 将创建代码抽离出来，让原本的函数或类职责更单一，代码更简洁
 */
public class FactoryTs {

    public static void main(String[] args) {

        String path = "D:\\data\\ctr\\hello.json";

        //简单工厂 - 1
        SimpleConfigSource simpleConfigSource = new SimpleConfigSource();
        simpleConfigSource.load(path);

        //简单工厂 - 2 parser可以复用
        SimpleConfigSourceV2 s2 = new SimpleConfigSourceV2();
        s2.load(path);

        /**
         * 当对象的创建逻辑比较复杂，不只是简单的 new 一下就可以，
         * 而是要组合其他类对象，做各种初始化操作的时候，我们推荐使用工厂方法模式，
         * 将复杂的创建逻辑拆分到多个工厂类中，让每个工厂类都不至于过于复杂。
         * 而使用简单工厂模式，将所有的创建逻辑都放到一个工厂类中，会导致这个工厂类变得很复杂
         *
         * 在某些场景下，如果对象不可复用，那工厂类每次都要返回不同的对象。
         * 如果我们使用简单工厂模式来实现，就只能选择第一种包含 if 分支逻辑的实现方式。
         * 如果我们还想避免烦人的 if-else 分支逻辑，这个时候，我们就推荐使用工厂方法模式
         */
        String p2 = "D:\\data\\ctr\\hello.sql";
        MethodConfigSource s3 = new MethodConfigSource();
        s3.load(p2);
        s3.load(p2);
        String p3 = "D:\\data\\ctr\\hello.es";
        s3.load(p3);
        s3.load(p3);


        /**
         * https://www.cnblogs.com/huangqingshi/p/10344265.html
         * spring 中可以直接参考这周方式实现
         */


    }

}
